#!/bin/bash

# X11窗口调试指南 - 使用xwininfo和xprop工具

echo "===== X11窗口调试指南 ====="
echo "本指南介绍如何使用xwininfo和xprop工具调试X11窗口问题"

echo -e "\n=== 1. xwininfo使用方法 ==="
echo "xwininfo工具用于获取X窗口的基本信息，如窗口ID、位置、大小等。"
echo
echo "基本用法:"
echo "  $ xwininfo                   # 交互式选择窗口（点击要查询的窗口）"
echo "  $ xwininfo -root             # 查询根窗口信息"
echo "  $ xwininfo -id 窗口ID        # 使用窗口ID查询"
echo "  $ xwininfo -name \"窗口名称\"  # 使用窗口名称查询"
echo "  $ xwininfo -all              # 显示所有信息，包括窗口树"
echo "  $ xwininfo -tree -root       # 显示完整窗口层次结构"
echo
echo "调试我们的程序:"
echo "  1. 先运行 ./simple_x11_client"
echo "  2. 在另一个终端中运行 xwininfo -name \"X11 Simple Window\""
echo "  3. 如果找不到窗口，尝试 xwininfo -tree -root 查看所有窗口"

echo -e "\n=== 2. xprop使用方法 ==="
echo "xprop工具用于查询窗口的X属性，如窗口类别、标题、协议支持等。"
echo
echo "基本用法:"
echo "  $ xprop                      # 交互式选择窗口（点击要查询的窗口）"
echo "  $ xprop -root                # 查询根窗口属性"
echo "  $ xprop -id 窗口ID           # 使用窗口ID查询"
echo "  $ xprop -name \"窗口名称\"     # 使用窗口名称查询"
echo "  $ xprop -spy                 # 监视属性变化"
echo "  $ xprop WM_CLASS             # 只查询特定属性"
echo
echo "调试我们的程序:"
echo "  1. 先运行 ./simple_x11_client"
echo "  2. 在另一个终端中运行 xprop -name \"X11 Simple Window\""
echo "  3. 检查WM_NAME、WM_CLASS等属性是否正确设置"

echo -e "\n=== 3. 典型调试流程 ==="
echo "如果窗口不显示，请尝试以下步骤:"
echo "  1. 使用 xwininfo -tree -root 查看窗口是否创建且可见"
echo "     - 寻找我们窗口的ID和状态（映射/未映射）"
echo "  2. 使用 xprop -id 窗口ID 检查窗口属性"
echo "     - 检查 WM_STATE 属性（值应为 NormalState）"
echo "     - 检查 _NET_WM_STATE 是否有 _NET_WM_STATE_HIDDEN"
echo "  3. 如果窗口已创建但不可见，可能原因包括:"
echo "     - 窗口管理器拦截（检查WM_PROTOCOLS是否支持WM_TAKE_FOCUS）"
echo "     - 窗口位置超出屏幕范围"
echo "     - 窗口被其他窗口覆盖"
echo "     - 窗口被最小化"

echo -e "\n=== 4. 调试命令示例 ==="
echo "# 查找所有X11窗口"
echo "xwininfo -tree -root | grep -i simple"
echo
echo "# 一旦找到窗口ID后，获取详细信息"
echo "xwininfo -id 窗口ID"
echo
echo "# 检查窗口属性"
echo "xprop -id 窗口ID"
echo
echo "# 监视窗口状态变化"
echo "xprop -spy -id 窗口ID WM_STATE"
echo
echo "# 查看窗口管理器支持的协议"
echo "xprop -id 窗口ID WM_PROTOCOLS"

echo -e "\n=== 5. 改进程序的提示 ==="
echo "如果调试发现问题，可以尝试以下改进:"
echo "  - 设置WM_CLASS属性（窗口类别，帮助窗口管理器识别程序）"
echo "  - 支持WM_DELETE_WINDOW协议（允许窗口管理器正常关闭窗口）"
echo "  - 添加WM_HINTS属性（设置图标、初始状态等）"
echo "  - 添加WM_NORMAL_HINTS属性（设置大小限制、纵横比等）"
echo
echo "在simple_x11_client.c中可以添加这些功能"

echo -e "\n=== 6. 窗口ID不一致问题 ==="
echo "有时您可能会发现不同工具报告的窗口ID不一致，例如:"
echo "  - xwininfo显示根窗口ID为0xcd"
echo "  - 您的程序可能显示根窗口ID为0x00B8A594"
echo
echo "这种不一致可能由以下原因导致:"
echo "  1. 字节序问题 - X11协议处理大小端时可能导致ID显示不同"
echo "  2. 显示方式 - 工具可能以不同格式显示相同ID(十六进制表示法不同)"
echo "  3. X服务器连接 - 不同的连接会话可能获取不同的资源ID映射"
echo "  4. 多显示器设置 - 不同显示器可能有不同的根窗口"
echo
echo "调试此类问题的方法:"
echo "  1. 确保两个工具连接到完全相同的DISPLAY (环境变量相同)"
echo "  2. 尝试使用窗口的其他属性(如位置、大小)进行验证"
echo "  3. 检查您的程序如何处理和显示窗口ID(可能需要转换格式)"
echo "  4. 使用XGetGeometry验证窗口几何信息是否匹配"
echo
echo "调试命令示例:"
echo "  $ DISPLAY=相同显示器 xwininfo -root"
echo "  $ DISPLAY=相同显示器 ./your_program"
echo "  $ xwininfo -root -display 10.33.118.38:0.0   # 显式指定DISPLAY"

echo -e "\n执行权限设置命令:"
echo "chmod +x ${0}"
echo -e "\n===== 调试愉快! ====="
